/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

include protocol PPluginInstance;
include protocol PPluginScriptableObject;
include protocol PContent;
include ProfilerTypes;

using NPError from "npapi.h";
using NPNVariable from "npapi.h";
using mozilla::dom::NativeThreadId from "mozilla/dom/TabMessageUtils.h";
using class mac_plugin_interposing::NSCursorInfo from "mozilla/plugins/PluginMessageUtils.h";
using struct nsID from "nsID.h";
using struct mozilla::plugins::NPAudioDeviceChangeDetailsIPC from "mozilla/plugins/PluginMessageUtils.h";

namespace mozilla {
namespace plugins {

struct PluginSettings
{
  // These settings correspond to NPNVariable. They are fetched from
  // mozilla::plugins::parent::_getvalue.
  bool javascriptEnabled;
  bool asdEnabled;
  bool isOffline;
  bool supportsXembed;
  bool supportsWindowless;

  // These settings come from elsewhere.
  nsCString userAgent;
  bool nativeCursorsSupported;
};

intr protocol PPluginModule
{
  bridges PContent, PPluginModule;

  manages PPluginInstance;

both:
  // Window-specific message which instructs the interrupt mechanism to enter
  // a nested event loop for the current interrupt call.
  async ProcessNativeEventsInInterruptCall();

child:
  async DisableFlashProtectedMode();

  // Sync query to check if a Flash library indicates it
  // supports async rendering mode.
  intr ModuleSupportsAsyncRender()
    returns (bool result);

  // Forces the child process to update its plugin function table.
  intr NP_GetEntryPoints()
    returns (NPError rv);

  intr NP_Initialize(PluginSettings settings)
    returns (NPError rv);

  async AsyncNP_Initialize(PluginSettings settings);

  async PPluginInstance(nsCString aMimeType,
                        uint16_t aMode,
                        nsCString[] aNames,
                        nsCString[] aValues);

  // Implements the synchronous version of NPP_New for when async plugin init
  // is preffed off.
  intr SyncNPP_New(PPluginInstance aActor)
    returns (NPError rv);

  // Implements the async plugin init version of NPP_New.
  async AsyncNPP_New(PPluginInstance aActor);

  intr NP_Shutdown()
    returns (NPError rv);

  intr OptionalFunctionsSupported()
    returns (bool aURLRedirectNotify, bool aClearSiteData,
             bool aGetSitesWithData);

  async NPP_ClearSiteData(nsCString site, uint64_t flags, uint64_t maxAge, uint64_t aCallbackId);

  async NPP_GetSitesWithData(uint64_t aCallbackId);

  // Windows specific message to set up an audio session in the plugin process
  async SetAudioSessionData(nsID aID,
                            nsString aDisplayName,
                            nsString aIconPath);

  async SetParentHangTimeout(uint32_t seconds);

  async SettingChanged(PluginSettings settings);

  async NPP_SetValue_NPNVaudioDeviceChangeDetails(NPAudioDeviceChangeDetailsIPC changeDetails);

parent:
  async NP_InitializeResult(NPError aError);

  /**
   * This message is only used on X11 platforms.
   *
   * Send a dup of the plugin process's X socket to the parent
   * process.  In theory, this scheme keeps the plugin's X resources
   * around until after both the plugin process shuts down *and* the
   * parent process closes the dup fd.  This is used to prevent the
   * parent process from crashing on X errors if, e.g., the plugin
   * crashes *just before* a repaint and the parent process tries to
   * use the newly-invalid surface.
   */
  async BackUpXResources(FileDescriptor aXSocketFd);

  // Wake up and process a few native events.  Periodically called by
  // Gtk-specific code upon detecting that the plugin process has
  // entered a nested event loop.  If the browser doesn't process
  // native events, then "livelock" and some other glitches can occur.
  intr ProcessSomeEvents();

  // OS X Specific calls to manage the plugin's window
  // when interposing system calls.
  async PluginShowWindow(uint32_t aWindowId, bool aModal,
                         int32_t aX, int32_t aY,
                         size_t aWidth, size_t aHeight);
  async PluginHideWindow(uint32_t aWindowId);

  // OS X Specific calls to allow the plugin to manage the cursor.
  async SetCursor(NSCursorInfo cursorInfo);
  async ShowCursor(bool show);
  async PushCursor(NSCursorInfo cursorInfo);
  async PopCursor();

  sync NPN_SetException(nsCString message);

  async NPN_ReloadPlugins(bool aReloadPages);

  // Notifies the chrome process that a PluginModuleChild linked to a content
  // process was destroyed. The chrome process may choose to asynchronously shut
  // down the plugin process in response.
  async NotifyContentModuleDestroyed();

  // Answers to request about site data
  async ReturnClearSiteData(NPError aRv, uint64_t aCallbackId);

  async ReturnSitesWithData(nsCString[] aSites, uint64_t aCallbackId);

  intr GetKeyState(int32_t aVirtKey)
    returns (int16_t aState);

  intr NPN_SetValue_NPPVpluginRequiresAudioDeviceChanges(bool shouldRegister)
    returns (NPError result);
};

} // namespace plugins
} // namespace mozilla
